GtkSymbolicColor: Add gtk_symbolic_color_new_alpha()
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 25 Oct 2010 18:41:36 +0000 (20:41 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Sat, 4 Dec 2010 14:38:28 +0000 (15:38 +0100)
This function modifies the alpha channel of a color, multiplying
it by a factor.

gtk/gtksymboliccolor.c
gtk/gtksymboliccolor.h

index 92d3eff9e3b1482a3d5e7512a8992f14b794cd12..f45c8d2046d460ee4c612c125f798409791755ef 100644 (file)
@@ -32,6 +32,7 @@ typedef enum {
   COLOR_TYPE_LITERAL,
   COLOR_TYPE_NAME,
   COLOR_TYPE_SHADE,
+  COLOR_TYPE_ALPHA,
   COLOR_TYPE_MIX
 } ColorType;
 
@@ -49,7 +50,7 @@ struct _GtkSymbolicColor
     {
       GtkSymbolicColor *color;
       gdouble factor;
-    } shade;
+    } shade, alpha;
 
     struct
     {
@@ -165,6 +166,37 @@ gtk_symbolic_color_new_shade (GtkSymbolicColor *color,
   return symbolic_color;
 }
 
+/**
+ * gtk_symbolic_color_new_alpha:
+ * @color: another #GtkSymbolicColor
+ * @factor: factor to apply to @color alpha
+ *
+ * Creates a symbolic color by modifying the relative alpha
+ * value of @color. A factor < 1.0 would resolve to a more
+ * transparent color, while > 1.0 would resolve to a more
+ * opaque color.
+ *
+ * Returns: A newly created #GtkSymbolicColor
+ *
+ * Since: 3.0
+ **/
+GtkSymbolicColor *
+gtk_symbolic_color_new_alpha (GtkSymbolicColor *color,
+                              gdouble           factor)
+{
+  GtkSymbolicColor *symbolic_color;
+
+  g_return_val_if_fail (color != NULL, NULL);
+
+  symbolic_color = g_slice_new0 (GtkSymbolicColor);
+  symbolic_color->type = COLOR_TYPE_ALPHA;
+  symbolic_color->alpha.color = gtk_symbolic_color_ref (color);
+  symbolic_color->alpha.factor = CLAMP (factor, 0, 1);
+  symbolic_color->ref_count = 1;
+
+  return symbolic_color;
+}
+
 /**
  * gtk_symbolic_color_new_mix:
  * @color1: color to mix
@@ -245,6 +277,9 @@ gtk_symbolic_color_unref (GtkSymbolicColor *color)
         case COLOR_TYPE_SHADE:
           gtk_symbolic_color_unref (color->shade.color);
           break;
+        case COLOR_TYPE_ALPHA:
+          gtk_symbolic_color_unref (color->alpha.color);
+          break;
         case COLOR_TYPE_MIX:
           gtk_symbolic_color_unref (color->mix.color1);
           gtk_symbolic_color_unref (color->mix.color2);
@@ -315,6 +350,18 @@ gtk_symbolic_color_resolve (GtkSymbolicColor *color,
       }
 
       break;
+    case COLOR_TYPE_ALPHA:
+      {
+        GdkRGBA alpha;
+
+        if (!gtk_symbolic_color_resolve (color->alpha.color, style_set, &alpha))
+          return FALSE;
+
+        *resolved_color = alpha;
+        resolved_color->alpha = CLAMP (alpha.alpha * color->alpha.factor, 0, 1);
+
+        return TRUE;
+      }
     case COLOR_TYPE_MIX:
       {
         GdkRGBA color1, color2;
index ce1d3c6fdc4a392ecdf6261daf454b6414b2c95e..d52a9d32c5f2a18bcab42e88f489a929362ff6b7 100644 (file)
@@ -38,6 +38,8 @@ GtkSymbolicColor * gtk_symbolic_color_new_literal (GdkRGBA          *color);
 GtkSymbolicColor * gtk_symbolic_color_new_name    (const gchar      *name);
 GtkSymbolicColor * gtk_symbolic_color_new_shade   (GtkSymbolicColor *color,
                                                    gdouble           factor);
+GtkSymbolicColor * gtk_symbolic_color_new_alpha   (GtkSymbolicColor *color,
+                                                   gdouble           factor);
 GtkSymbolicColor * gtk_symbolic_color_new_mix     (GtkSymbolicColor *color1,
                                                    GtkSymbolicColor *color2,
                                                    gdouble           factor);